package com.smart.community.region.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.result.PageResult;
import com.smart.community.region.dto.PaymentInfoDTO;
import com.smart.community.region.dto.ShopRentRecordDTO;
import com.smart.community.region.entity.ShopRentRecord;
import com.smart.community.region.vo.ShopRentRecordVO;
import com.smart.community.region.vo.ShopRentStatisticsVO;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 店铺租金记录Service接口
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-09-30
 */
public interface IShopRentRecordService extends IService<ShopRentRecord> {
    
    /**
     * 分页查询租金记录
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param shopId 店铺ID
     * @param ownerId 店铺业主ID
     * @param paymentStatus 支付状态
     * @param rentPeriod 租金期间
     * @param rentMonth 租金月份
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分页结果
     * @throws Exception 异常
     */
    PageResult<ShopRentRecordVO> getRentRecordPage(Integer current, Integer size, Long shopId, Long ownerId, Integer paymentStatus, String rentPeriod, String rentMonth, LocalDate startDate, LocalDate endDate) throws Exception;
    
    /**
     * 根据ID获取租金记录详情
     * 
     * @param id 记录ID
     * @return 租金记录详情
     * @throws Exception 异常
     */
    ShopRentRecordVO getRentRecordById(Long id) throws Exception;
    
    /**
     * 根据店铺ID查询租金记录列表
     * 
     * @param shopId 店铺ID
     * @return 租金记录列表
     * @throws Exception 异常
     */
    List<ShopRentRecordVO> getRentRecordsByShopId(Long shopId) throws Exception;
    
    
    /**
     * 根据支付状态查询租金记录列表
     * 
     * @param paymentStatus 支付状态
     * @return 租金记录列表
     * @throws Exception 异常
     */
    List<ShopRentRecordVO> getRentRecordsByPaymentStatus(Integer paymentStatus) throws Exception;
    
    /**
     * 根据租金期间查询租金记录列表
     * 
     * @param rentPeriod 租金期间
     * @return 租金记录列表
     * @throws Exception 异常
     */
    List<ShopRentRecord> getRentRecordsByPeriod(String rentPeriod) throws Exception;
    
    /**
     * 根据日期范围查询租金记录列表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 租金记录列表
     * @throws Exception 异常
     */
    List<ShopRentRecord> getRentRecordsByDateRange(LocalDate startDate, LocalDate endDate) throws Exception;
    
    /**
     * 创建租金记录
     * 
     * @param rentRecordDTO 租金记录DTO
     * @return 记录ID
     * @throws Exception 异常
     */
    Long createRentRecord(ShopRentRecordDTO rentRecordDTO) throws Exception;
    
    /**
     * 更新租金记录
     * 
     * @param rentRecordDTO 租金记录DTO
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean updateRentRecord(ShopRentRecordDTO rentRecordDTO) throws Exception;
    
    /**
     * 支付租金
     * 
     * @param recordId 记录ID
     * @param paymentInfo 支付信息
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean payRent(Long recordId, PaymentInfoDTO paymentInfo) throws Exception;
    
    /**
     * 删除租金记录
     * 
     * @param id 记录ID
     * @return 是否成功
     * @throws Exception 异常
     */
    Boolean deleteRentRecord(Long id) throws Exception;
    
    /**
     * 统计租金记录数量
     * 
     * @param shopId 店铺ID
     * @param paymentStatus 支付状态
     * @return 租金记录数量
     * @throws Exception 异常
     */
    Integer countRentRecords(Long shopId, Integer paymentStatus) throws Exception;
    
    /**
     * 统计租金总金额
     * 
     * @param shopId 店铺ID
     * @param paymentStatus 支付状态
     * @return 租金总金额
     * @throws Exception 异常
     */
    BigDecimal sumRentAmount(Long shopId, Integer paymentStatus) throws Exception;
    
    /**
     * 获取租金统计信息
     * 
     * @param shopId 店铺ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 租金统计信息
     * @throws Exception 异常
     */
    ShopRentStatisticsVO getRentStatistics(Long shopId, LocalDate startDate, LocalDate endDate) throws Exception;
}
